package com.java;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

/**
 * java
 * 多线程中，第三种获得多线程的方式
 * 实现Callable接口
 * 在得到结果之前调用FutureTask对象的get(),程序会阻塞，直到拿到结果
 * 对于同一个FutureTask对象，启动多个线程，call()只会调用一次，会把结果缓存下来
 * @author jingjintao
 * @date 2021/10/24 - 17:24
 **/
public class CallableDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask futureTask = new FutureTask(new MyThread());
        new Thread(futureTask,"A").start();
        new Thread(futureTask,"B").start();
        System.out.println("计算完成.......");
        System.out.println(futureTask.get());
    }
}

/**
 * 和实现Runnable接口有何区别
 * 1.Callable接口重新call(),Runnable接口重新run()
 * 2.call()可以抛出异常，有返回值。run()不能抛出异常，没有返回值
 */
class MyThread implements Callable<Integer>{

    @Override
    public Integer call() throws Exception {
        System.out.println("***********come in here");
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return 1024;
    }
}
